package com.tuanzi.loan.workflow.service;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.springframework.data.domain.Page;

import com.tuanzi.loan.business.entity.system.SystemUser;
import com.tuanzi.loan.core.vo.PageSearcher;
import com.tuanzi.loan.vo.request.system.ProcessDefinitionSearchRequest;
import com.tuanzi.loan.workflow.vo.ActivityResponse;
import com.tuanzi.loan.workflow.vo.AssigneeResponse;
import com.tuanzi.loan.workflow.vo.ProcessDefinitionResponse;
import com.tuanzi.loan.workflow.vo.StarterResponse;

/**
 * @author Ray
 * @date 2018/01/16
 */
public interface WorkflowManagerService {

	/**
	 * 分页查询所有最新版本的流程定义
	 * 
	 * @param request
	 * @return
	 */
	Page<ProcessDefinitionResponse> listLastVersionProcessDefinition(PageSearcher<ProcessDefinitionSearchRequest> request);

	/**
	 * 职责：部署流程定义
	 *
	 * @return
	 * @throws Exception
	 */
	String importProcessDefinition(String categoryId, InputStream workflowInputStream);

	/**
	 * 职责：根据流程定义ID导出文件
	 *
	 * @param procDefIds
	 *            流程定义ID
	 * @throws Exception
	 */
	void exportProcessDefinition(List<String> procDefIds, OutputStream os);

	/**
	 * 职责：查询所有最新版本的流程定义
	 *
	 * @return
	 * @Param categoryId 业务种类Id
	 */
	List<ProcessDefinitionResponse> findAllVersionProcessDefinition(String procDefKey);

	/**
	 * 职责：根据流程Key获取最新流程
	 *
	 * @Param procDefKey 业务种类Id
	 */
	ProcessDefinitionResponse findLatestVersionProcessDefinitionByProcDefKey(String procDefKey);

	/**
	 * 职责：根据流程定义ID删除记录
	 *
	 * @param procDefId
	 *            流程定义ID
	 * @throws Exception
	 */
	void deleteProcessDefinition(String procDefId);

	/**
	 * 职责：根据流程定义ID数组删除记录
	 *
	 * @param procDefIds
	 */
	void deleteProcessDefinition(List<String> procDefIds);

	/**
	 * 职责：根据流程定义ID禁用流程
	 *
	 * @param procDefId
	 */
	void suspendProcessDefinition(String procDefId);

	/**
	 * 职责：根据流程定义ID禁用流程
	 *
	 * @param procDefIds
	 */
	void suspendProcessDefinition(List<String> procDefIds);

	/**
	 * 职责：根据流程定义ID启用流程
	 *
	 * @param procDefId
	 */
	void activeProcessDefinition(String procDefId);

	/**
	 * 职责：根据流程定义ID启用流程
	 *
	 * @param procDefIds
	 */
	void activeProcessDefinition(List<String> procDefIds);

	/**
	 * 职责：获取流程部署的bpmn文件
	 *
	 * @param deployId
	 *            流程部署id
	 * @return
	 * @throws Exception
	 */
	InputStream getDeploymentBpmn(String deployId);

	/**
	 * 职责：获取流程部署图片
	 *
	 * @param deploymentId
	 *            流程部署id
	 */
	InputStream getDeploymentImage(String deploymentId);

	/**
	 * 职责：获取第一节点（不包括开始节点）
	 *
	 * @param procDefId
	 *            流程定义id
	 * @return
	 * @throws Exception
	 */
	ActivityResponse findActivity(String procDefId, String activityId);

	/**
	 * 根据Assignee获取用户
	 * 
	 * @param assigneeResponses
	 * @return
	 */
	List<SystemUser> findSystemUserByAssignees(List<AssigneeResponse> assigneeResponses);

	//
	/**
	 * 职责：根据流程定义id，获取该流程定义的所有流程节点 注意：这个接口只拿所以UserTask的节点
	 *
	 * @param procDefId
	 *            流程定义id
	 * @return
	 * @throws Exception
	 */
	List<ActivityResponse> findAllUserTaskActivity(String procDefId);

	//
	/**
	 * 职责：根据流程定义id，获取该流程定义的所有流程节点
	 *
	 * @param procDefId
	 *            流程定义id
	 * @return
	 * @throws Exception
	 */
	List<ActivityResponse> findAllActivity(String procDefId);

	/**
	 * 根据流程定义ID,获取流程定义第一个用户任务节点
	 * 
	 * @param procDefId
	 * @return
	 */
	ActivityResponse findFirstUserTaskActivity(String procDefId);

	/**
	 * 职责：保存流程节点配置信息，注意：保存新配置，其实就是重新部署一次，版本+1
	 *
	 */
	void saveActivity(String procDefId, List<ActivityResponse> activityResponses);

	/**
	 * 根据流程定义key，判断流程定义是否已存在
	 *
	 * @param procDefKey
	 * @return
	 */
	boolean isExitsProcessDefinitionByProcDefKey(String procDefKey);

	/**
	 * 根据流程定义ID，判断流程定义是否已存在
	 *
	 * @param procDefId
	 * @return
	 */
	boolean isExitsProcessDefinitionByProcDefId(String procDefId);

	/**
	 * 根据流程定义ID计算流程实例数量
	 * 
	 * @param procDefId
	 * @return
	 */
	Long countProcInstByProcDefId(String procDefId);

	/**
	 * 根据流程定义Key获取用户
	 * 
	 * @param procDefKey
	 * @return
	 */
	List<SystemUser> findFirstActivitySystemUserProcDefKey(String procDefKey);

	/**
	 * 添加启动者到流程中
	 * 
	 * @param starters
	 */
	void addStarter(List<StarterResponse> starters);

	/**
	 * 从流程中删除启动者
	 *
	 * @param starters
	 */
	void removeStarter(List<StarterResponse> starters);

	/**
	 * 根据流程定义ID获取流程
	 * 
	 * @param procDefId
	 * @return
	 */
	ProcessDefinitionResponse findOneByProcDefId(String procDefId);

	/**
	 * 根据流程定义ID获取启动者
	 * 
	 * @param procDefId
	 * @return
	 */
	List<StarterResponse> findStarterBy(String procDefId);
}
